import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体支持（避免中文标签显示问题）
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']  # 根据系统选择字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 假设df是包含大学分数的DataFrame，包含"学校名称"和"总分"列
# 如果数据需要从文件读取，可以使用以下代码（示例为CSV文件）：
# df = pd.read_csv('university_scores.csv')

# 生成示例数据（实际使用时请注释掉并直接使用您的数据）
# np.random.seed(42)  # 保证可重复性
# sample_data = {
#     "学校名称": [f"大学{i}" for i in range(1, 101)],  # 生成100所大学名称
#     "总分": np.random.normal(loc=600, scale=50, size=100)  # 生成正态分布的总分数据
# }
df = pd.read_excel("4 - 数据统计描述性分析\\2020年中国大学排名.xlsx")

# 创建图形和双坐标轴
fig, ax1 = plt.subplots(figsize=(10, 6))

# 1. 绘制直方图 (左侧Y轴)
# 使用bins=20将数据分为20个区间，alpha设置透明度为0.7以便重叠部分可见
# density=True将频率转换为密度，使直方图与KDE尺度一致
ax1.hist(df['总分'], bins=20, color='skyblue', edgecolor='black', alpha=0.7, density=True)
ax1.set_xlabel('总分', fontsize=12)
ax1.set_ylabel('密度', color='skyblue', fontsize=12)  # 直方图对应左侧Y轴
ax1.tick_params(axis='y', labelcolor='skyblue')

# 2. 在同一图上绘制核密度估计（KDE）图 (右侧Y轴)
ax2 = ax1.twinx()  # 共享同一X轴，创建右侧Y轴
df['总分'].plot.density(bw_method=0.5, linewidth=2, color='red', ax=ax2)  # bw_method控制平滑度
ax2.set_ylabel('密度估计', color='red', fontsize=12)  # KDE对应右侧Y轴
ax2.tick_params(axis='y', labelcolor='red')

# 设置图表标题和网格
plt.title('大学总分分布直方图与核密度估计', fontsize=14, pad=20)
ax1.grid(True, linestyle='--', alpha=0.7)  # 添加网格线

# 显示图形
plt.tight_layout()
plt.show()